package br.com.equus.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.ControleDoador;
import br.com.equus.entidade.TipoAnimal;
import br.com.equus.entidade.Usuario;
import br.com.equus.util.Constantes;

@ManagedBean(name = "doadoraBean")
@ViewScoped
public class DoadoraBean extends PaginableBean<ControleDoador> {

	private static final long serialVersionUID = 1L;

	private Animal animal;

	private Animal garanhao;

	private ControleDoador animalEfetivado;

	private String efetivado;

	private Integer qtdEfetivado;

	public DoadoraBean() {
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_DOADORA");

	}

	@PostConstruct
	public void carregarListas() {
		try {
			Integer idAnimal = (Integer) getSessionMap().remove("idAnimal");
			if (idAnimal != null) {
				animal = (Animal) universalManager.get(Animal.class, idAnimal);
			}
			Boolean save = (Boolean) getSessionMap().remove("saveDoador");
			if (save != null && save) {
				FacesMessagesUtil.addInfoMessage(this.getQualifiedName(), this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
			}
			Boolean saveEfetivo = (Boolean) getSessionMap().remove("saveEfetivo");
			if (saveEfetivo != null && saveEfetivo) {
				FacesMessagesUtil.addInfoMessage("Embrião ", this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
			}

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@SuppressWarnings("unchecked")
	public List<Animal> completeAnimal(String query) {
		List<Animal> sugestoes = new ArrayList<Animal>();
		Animal a = new Animal();
		a.setNome(query);
		a.setTipoAnimal(new TipoAnimal(TipoAnimal.GARANHAO));
		try {
			sugestoes = this.universalManager.listBy(a, true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@SuppressWarnings("unchecked")
	public String limparTela() {
		getSessionMap().put("idAnimal", animal.getId());
		return redirect("doadora.jsf");
	}

	@Override
	public String load() {
		try {
			super.load();
			garanhao = getModel().getAnimalGaranhao();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	@Override
	public String save() {
		try {

			// Calcula a diferença entre hoje e da data de inicio
			long diferenca = getModel().getDtColeta().getTime() - getModel().getDtInseminacao().getTime();

			// Quantidade de milissegundos em um dia
			int tempoDia = 1000 * 60 * 60 * 24;

			long diasDiferenca = diferenca / tempoDia;

			if (diasDiferenca < 6) {
				FacesMessagesUtil.addErrorMessage(" ", " A Data Coleta deve ser no mínimo 5 dias posterior a Data Inseminação ");
				return ERROR;
			}

			if (garanhao != null && garanhao.getId() != null) {
				getModel().setAnimalGaranhao(garanhao);
			} else {
				FacesMessagesUtil.addErrorMessage("Garanhão ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}

			Usuario userLogado = (Usuario) getSessionMap().get(Constantes.USUARIO_SESSAO);
			getModel().setUsuario(new Usuario(userLogado.getId()));
			getModel().setAnimal(new Animal(animal.getId()));

			super.save();

			getSessionMap().put("idAnimal", animal.getId());
			getSessionMap().put("saveDoador", true);

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return redirect("doadora.jsf");
	}

	public String saveEfetivo() {
		try {

			if (efetivado == null || efetivado.isEmpty()) {
				FacesMessagesUtil.addErrorMessage("Embrião Efetivado? ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}

			if (efetivado.equals("1") && (qtdEfetivado == null || qtdEfetivado == 0)) {
				FacesMessagesUtil.addErrorMessage("Qtd Embrião ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}

			if (efetivado.equals("1")) {
				animalEfetivado.setQtdEmbriaoEfetivado(qtdEfetivado);
				animalEfetivado.setFlgEmbriaoEfetivado(true);
			} else {
				animalEfetivado.setQtdEmbriaoNaoEfetivado(1);
				animalEfetivado.setFlgEmbriaoEfetivado(false);
			}

			universalManager.save(animalEfetivado);
		} catch (Exception e) {
			FacesMessagesUtil.addErrorMessage(this.getQualifiedName(), ConstantesARQ.ERRO_SALVAR);
			ExcecaoUtil.tratarExcecao(e);
		}

		getSessionMap().put("idAnimal", animal.getId());
		getSessionMap().put("saveEfetivo", true);

		return redirect("doadora.jsf");
	}

	@Override
	public String delete() {
		try {
			super.delete();
			this.animal = (Animal) universalManager.get(Animal.class, animal.getId());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	@Override
	public ControleDoador createModel() {
		return new ControleDoador();
	}

	@Override
	public String getQualifiedName() {
		return "Controle Doadora";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		if (animal != null && animal.getId() != null) {
			this.filters.put("animal.id", animal.getId().toString());
		} else {
			this.filters.put("animal.id", "0");
		}
		return this.filters;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public Animal getAnimal() {
		return animal;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Animal getGaranhao() {
		return garanhao;
	}

	public void setGaranhao(Animal garanhao) {
		this.garanhao = garanhao;
	}

	public ControleDoador getAnimalEfetivado() {
		return animalEfetivado;
	}

	public void setAnimalEfetivado(ControleDoador animalEfetivado) {
		this.animalEfetivado = animalEfetivado;
	}

	public String getEfetivado() {
		return efetivado;
	}

	public void setEfetivado(String efetivado) {
		this.efetivado = efetivado;
	}

	public Integer getQtdEfetivado() {
		return qtdEfetivado;
	}

	public void setQtdEfetivado(Integer qtdEfetivado) {
		this.qtdEfetivado = qtdEfetivado;
	}

}
